<?php
/**
 * 商品秒杀服务
 *
 */
namespace support;

use support\Redis;
use support\Request;
use Webman\RedisQueue\Redis as RedisQueue;
/**
 * Class Request
 * @package support
 */
class GoodsQueue
{

    /**
     * 单个商品入库
     * @param  $goods_id商品id或者是sku
     * @param  $stock 要入库的商品数量
     * @return string
     */
    function singleGoodsPut($goods_id, $stock = 0)
    {
        $goods_name = 'single_goods_'.$goods_id;

        Redis::set($goods_name, $stock);
    }

    /**
     * 获取某个商品库存
     */
    function getSingleGoodsStock($goods_id)
    {
        $goods_name = 'single_goods_'.$goods_id;

        return Redis::get($goods_name);
    }

    /**
     * 增加商品库存，如果没有查询到此商品库存信息则会创建为增加数量的库存
     */
    function incSingleGoodsStock($goods_id, $inc = 0)
    {
        $goods_name = 'single_goods_'.$goods_id;

        return Redis::incrBy($goods_name, $inc);
    }

    /**
     * 减少商品库存，如果没有查询到此商品库存信息则会创建为增加数量的库存
     */
    function decSingleGoodsStock($goods_id, $dec = 0)
    {
        $goods_name = 'single_goods_'.$goods_id;

        return Redis::decrBy($goods_name, $dec);
    }

    /**
     * 单个抢购商品，抢购成功以后库存减相对应个数，然后入队列由队列去做入库操作
     */
    function purchaseSingleGoods($goods_id, $user_id ,$buy_nums = 1)
    {
        $goods_name = 'single_goods_'.$goods_id;

        $isset = Redis::get($goods_name);
        if(!$isset)
        {
            return false;
        }
        $stock = self::getSingleGoodsStock($goods_id);
        //echo $stock;
        if($stock >0 && $stock>= $buy_nums)
        {
            $res = self::decSingleGoodsStock($goods_id, $buy_nums);
            if($res)
            {
                //插入队列通过队列写入数据库
                try{
                    // 队列名
                    $queue = 'purchase_sign_goods';
                    $data  = ['goods_id' => $goods_id, 'buy_nums'=>$buy_nums, 'user_id' => $user_id];
                    // 投递消息
                    $queue_res = RedisQueue::send($queue, $data);
                    if(!$queue_res)
                    {
                        //如果入队列失败了
                        self::incSingleGoodsStock($goods_id, $buy_nums);

                        return false;
                    }else{
                        return true;
                    }
                }catch(\Exception $e)
                {
                    //如果入队列失败了,库存再加回来
                    self::incSingleGoodsStock($goods_id, $buy_nums);

                    return false;
                }
            }
        }else{
            //echo '库存空0';
            return false;
        }
    }

    /**
     * 列表商品入库
     * @param  $list_goods 商品id数组
     * @param  $list_name  设置此商品的列表名称
     * @return string
     */
    public function listGoodsPut(array $list_goods = [], $list_name)
    {
        try{
            if(!$list_name)
            {
                $list_name = 'normal_list_goods';
            }
            return Redis::rPush($list_name, $list_goods);
        }catch(\Exception $e)
        {
            return false;
        }
    }

    /**
     * 获取某个商品列表里商品数据
     */
    public function getListGoods($list_name)
    {
        return $list_goods = Redis::lRange($list_name,  0, -1);
    }

    /**
     * 去除列表商品里的一个数据
     */
    function purchaseListGoods($list_name, $user_id)
    {
        $list_goods_len = Redis::lLen($list_name);
        if(!$list_goods_len || $list_goods_len == 0)
        {
            return false;
        }
        try{
            $goods_id = Redis::rPop($list_name);
            // 队列名
            $queue = 'purchase_list_goods';
            $data  = ['goods_id' => $goods_id, 'user_id' => $user_id];
            // 投递消息
            $queue_res = RedisQueue::send($queue, $data);
            if(!$queue_res)
            {
                //如果入队列失败了
                Redis::rPush($list_name, $goods_id);

                return false;
            }else{
                return true;
            }
        }catch(\Exception $e)
        {
            return false;
        }
    }
}